package cn.itcast.scala.course03

/**
  * create by zhangtian on 2018/12/28
  */
object FunctionApp {
  def main(args: Array[String]): Unit = {
    println(add(1, 4))

    println("******************* 函数定义和使用 ********************")
    println(three())
    println(three) // 但一个函数没有入参的时候，()是可以省略的

    sayHello()
    sayHello

    sayHello("张三") // 有参数的方法不能省略()

    println("******************* 默认参数 ********************")
    sayName()
    sayName("忘水年华")
    // 默认参数很有用  spark中有一个示例  如果没有自己传配置文件，则读取默认的配置文件
    readConf()
    readConf("spark-production.conf")

    println("******************* 命名参数 ********************")
    println(speed(100, 10))
    println(speed(distance = 100, time = 10))
    println(speed(time = 10, distance = 100))

    println("******************* 可变参数 ********************")
    println(sum())
    println(sum(1))
    println(sum(1, 2, 3))
  }

  def add(x: Int, y: Int) : Int = {
    x + y // 最后一行就是返回值， 不需要return
  }

  def three() = 1 + 2 // 自动类型推断

  def sayHello(): Unit ={// 直接sanyHello(){} 回车  IDEA会自动补上返回类型Unit
    println("say Hello ...")
  }

  def sayHello(name: String): Unit ={
    println("say Hello ..." + name)
  }

  def sayName(name: String = "水梦星光"): Unit ={
    println("实际参数:" +name)
  }

  def readConf(conf: String = "spark-default.conf"): Unit ={
    println("读取的实际配置:" +conf)
  }

  def speed(distance: Float, time: Float): Float = {
    distance / time
  }

  def sum(numbers: Int*): Int = {
    var result = 0
    for (number <- numbers){
      result += number
    }

    result
  }
}
